#include <iostream>
using namespace std;
const int N = 1e7 + 10;
// KMP 算法
// 核心思想:
// 通过每次匹配失败时已经掌握的信息来跳过暴力做法中"必定失败"和"一定成功"的一一比对
char p_arr[N], s_arr[N];
int len_p, len_s;
int next_arr[N];
//////////////////////////////////////////////////////////////
// 个人版 (顺着自己思路编写)
void next_arr_init()
{
    int len = 0;
    next_arr[len] = 0;
    // i 从1开始
    int i = 1;
    // 遍历
    while (i < len_p)
    {
        // 相等++
        if (p_arr[i] == p_arr[len])
            next_arr[i++] = ++len;
        // 不相等
        else
            // len 已经为0
            if (len == 0)
                next_arr[i++] = 0;
            // len不为0
            else
                len = next_arr[len - 1];
    }
}
int main()
{
    cin >> len_p >> p_arr >> len_s >> s_arr;
    next_arr_init();
    int i = 0, j = 0;
    // 遍历 s
    while (i < len_s)
    {
        // 相等 更新 i,j
        if (s_arr[i] == p_arr[j])
            i++, j++;
        // 不相等
        else
        {
            if (j) // j不在开头 即查表
                j = next_arr[j - 1];
            else // 在开头 则这个位置匹配失败 更新 i
                i++;
            continue;
        }
        // 匹配成功
        if (j == len_p)
        {
            cout << i - len_p << ' ';
            // 更新j寻找下一个子串
            j = next_arr[j - 1];
        }
    }
    return 0;
}
//////////////////////////////////////////////////////////////
// acwing 模板
void next_arr_init()
{
    // 第一个匹配不到不会查next表
    // 第二个匹配不到从第一个开始 //bba ba
    int len = 0;
    next_arr[len] = 0;
    for (int i = 1; i < len_p; i++)
    {
        // len不为0且不相等 尝试更短的公共前后缀
        // 因为[0,len-1][i-len-1,i-1]匹配
        // 所以直接查next[len-1]即可尝试匹配更短的公共前后缀
        while (len && p_arr[len] != p_arr[i])
            len = next_arr[len - 1];
        // 相等即更新公共前后缀长度
        if (p_arr[len] == p_arr[i])
            len++;
        // 更新next数组
        next_arr[i] = len;
    }
}
int main()
{
    cin >> len_p >> p_arr >> len_s >> s_arr;
    // 初始化next数组
    next_arr_init();
    // 遍历s串
    for (int i = 0, j = 0; i < len_s; i++)
    {
        // 如果j不为0或匹配失败则查表,来跳过暴力做法中"必定失败"的查找
        while (j && s_arr[i] != p_arr[j])
            j = next_arr[j - 1];
        if (s_arr[i] == p_arr[j])
            j++;
        // 匹配成功 输出答案
        if (j == len_p)
        {
            cout << i + 1 - len_p << ' ';
            // 更新 j 寻找下一个子串 因为s==j所以可以直接查next最后一个
            j = next_arr[j - 1];
        }
    }
    return 0;
}